package Utils;

import com.my.DAO.MyDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

import java.lang.reflect.Method;

public class MyFactoryBean implements FactoryBean {
//为了实现灵活的动态代理 我们可以传入一个Class对象 这个对象就是被代理的接口的Class对象
    private Class clazz;
    private SqlSession sqlSession;
    public MyFactoryBean(Class clazz) {
        this.clazz = clazz;
    }

    @Override
    public Object getObject() throws Exception {
        //这里返回的对象会自动的被Spring管理  所以我们可以将MyBatis生成的DAO接口的代理对象 添加到这里  让代理对象可以被Spring管理
//        生成一个myDAO的代理对象

//        Object proxy= Proxy.newProxyInstance(MyFactoryBean.class.getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
//            @Override
//            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                System.out.println(method.getName());
//                return null;
//            }
//        });
//        return proxy;

      return sqlSession.getMapper(MyDAO.class);

    }
    @Autowired
    public void setSqlSession(SqlSessionFactory sqlSessionFactory) {
        sqlSessionFactory.getConfiguration().addMapper(clazz);
        this.sqlSession = sqlSessionFactory.openSession();

    }

    @Override
    public Class<?> getObjectType() {
        return clazz;
    }
}
